﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using MvcCaja.Core.Interfaces;
using Chilis.Caja.Data.Models;
using System.Data;
 

namespace MvcCaja.Core
{
    public class CajaService : ICajaService
    {
        public List<Caja> ObtenerTodos()
        {
            ModelDataContext db = new ModelDataContext();

            return (from n in db.Caja
                    select n).ToList<Caja>();
        }


        public List<MovimientoCaja> ListarMovimientos()
        {
            ModelDataContext db = new ModelDataContext();


            return (from n in db.MovimientoCaja
                    select n).ToList<MovimientoCaja>();
        }

        public List<MovimientoCaja> ListarMovimientos(string fecIni, string fecFin, string caja, string empleado)
        {
            ModelDataContext db = new ModelDataContext();

            DateTime _FecIni = Convert.ToDateTime(fecIni);
            DateTime _FecFin = Convert.ToDateTime(fecFin);

            var _movimientos = from mov in db.MovimientoCaja
                               where mov.FechaHoraMovimiento >= _FecIni && mov.FechaHoraMovimiento <= _FecFin
                               select mov;

            return (_movimientos).ToList<MovimientoCaja>();
        }

        public List<MovimientoCaja> MovimientoCajaConsumo(string vCodigoOrden, DateTime vFechaMovimiento)
        {
            ModelDataContext db = new ModelDataContext();

            var movcaja = (from n in db.MovimientoCaja
                        where n.IdOrden.Equals(vCodigoOrden) && n.FechaHoraMovimiento.Equals(vFechaMovimiento)
                        select n);

            return movcaja.ToList<MovimientoCaja>();
        }

        public MovimientoCaja ObtenerMovimientoCaja(string vCodigoOrden, DateTime vFechaMovimiento)
        {
            ModelDataContext db = new ModelDataContext();

            var movcaja =   (from n in db.MovimientoCaja
                            where n.IdOrden.Equals(vCodigoOrden) & 
                            n.FechaHoraMovimiento.Equals(vFechaMovimiento)
                            select n).Distinct();

            return movcaja.First<MovimientoCaja>();
        }

        public List<MovimientoCaja> ListarMovimientosPorPago(string codigoOrden)
        {
            ModelDataContext db = new ModelDataContext();

            return (from n in db.MovimientoCaja
                    orderby n.IdOrden ascending
                    where n.IdOrden.Equals(codigoOrden)
                    select n).ToList<MovimientoCaja>();
        }

        public int validarUsuario(string usuario, string pass) { 
            ModelDataContext db = new ModelDataContext();

            
            return (from n in db.Administrador
                    where n.IdAdministrador.Equals(usuario) & n.PassAcceso.Equals(pass)
                        select n).Count();

        }





        /// <summary>
        /// JF
        /// </summary>
        /// <returns></returns>
        public List<Caja> ListarCaja()
        {
            ModelDataContext db = new ModelDataContext();
            //return (from n in db.Caja
            //        orderby n.IdCaja ascending 
            //        select n).ToList<Caja>();

            return (from n in db.Caja
                    join tc in db.CajaTurno
                        on    n.IdCaja  equals   tc.IdCaja  
                    orderby n.IdCaja ascending
                    select n).ToList<Caja>();
        }


        public List<CajaTurnoCajero> ListarCajaP()
        {
            ModelDataContext db = new ModelDataContext();
           return (from n in db.CajaTurnoCajero
                   orderby n.IdCaja ascending
                   select n).ToList<CajaTurnoCajero>();
             
        }



        

        public List<Caja> ObtenerCaja(string idCaja)
        {
            ModelDataContext db = new ModelDataContext();
            return (from n in db.Caja
                  
                    where n.IdCaja.Equals(idCaja) 
                    select n).ToList<Caja>();
        }

        public void actualizar(string idCaja, string DesCaja, string cajero, string turno)
        {
            ModelDataContext db = new ModelDataContext();
            Caja oCaja=(from n in db.Caja  where n.IdCaja.Equals(idCaja)
                        select n).First<Caja>();


            CajaTurno oCajaTurno = (from n in db.CajaTurno
                                    where n.IdCaja.Equals(idCaja)
                                    select n).First<CajaTurno>();

            CajaTurnoCajero oCajaTurnoCajero = (from n in db.CajaTurnoCajero
                                                where n.IdCaja.Equals(idCaja)
                                                select n).First<CajaTurnoCajero>();


            db.CajaTurnoCajero.DeleteOnSubmit(oCajaTurnoCajero);
            db.CajaTurno.DeleteOnSubmit(oCajaTurno);

            CajaTurno oCajaTurnoB = new CajaTurno();
            oCajaTurnoB.IdCaja = idCaja;
            oCajaTurnoB.IdTurno = turno;
            db.CajaTurno.InsertOnSubmit(oCajaTurnoB);

            CajaTurnoCajero oCajaTurnoCajeroB = new CajaTurnoCajero();
            oCajaTurnoCajeroB.IdCaja = idCaja;
            oCajaTurnoCajeroB.IdTurno = turno;
            oCajaTurnoCajeroB.IdCajero = cajero;
            db.CajaTurnoCajero.InsertOnSubmit(oCajaTurnoCajeroB);


            oCaja.NombreCaja = DesCaja;
            db.SubmitChanges();
 
        }

        public void eliminar(string idCaja)
        {
            ModelDataContext db = new ModelDataContext();
            Caja oCaja = (from n in db.Caja
                          where n.IdCaja.Equals(idCaja)
                          select n).First<Caja>();

            CajaTurno oCajaTurno = (from n in db.CajaTurno
                          where n.IdCaja.Equals(idCaja)
                          select n).First<CajaTurno>();

            CajaTurnoCajero oCajaTurnoCajero = (from n in db.CajaTurnoCajero
                                    where n.IdCaja.Equals(idCaja)
                                                select n).First<CajaTurnoCajero>();

            db.CajaTurnoCajero.DeleteOnSubmit(oCajaTurnoCajero);
            db.CajaTurno.DeleteOnSubmit(oCajaTurno);
            db.Caja.DeleteOnSubmit(oCaja);
            db.SubmitChanges(); 

        }

        public void ingresar(string DesCaja, string cajero, string turno)
        {
            ModelDataContext db = new ModelDataContext();
            string valor ="";
            try{
            Caja oCaja = (from n in db.Caja
                          orderby n.IdCaja descending 
                          select n).First<Caja>();
            valor = oCaja.IdCaja;
            }
            catch (Exception e)
            {
                valor = "";
            }
             
            if (valor.Equals(""))
                valor = "00";
            else
               valor = valor.Substring(8, 2);

            int codigo = Convert.ToInt32(valor) + 1;


            Caja caja = new Caja();
            caja.IdCaja = "CJ000000" + codigo.ToString("00");
            caja.NombreCaja = DesCaja;
            db.Caja.InsertOnSubmit(caja);

            CajaTurno oCajaTurno = new CajaTurno();
            oCajaTurno.IdCaja = caja.IdCaja;
            oCajaTurno.IdTurno = turno;
            db.CajaTurno.InsertOnSubmit(oCajaTurno);

            CajaTurnoCajero oCajaTurnoCajero = new CajaTurnoCajero();
            oCajaTurnoCajero.IdCaja = caja.IdCaja;
            oCajaTurnoCajero.IdTurno = oCajaTurno.IdTurno;
            oCajaTurnoCajero.IdCajero = cajero;
            db.CajaTurnoCajero.InsertOnSubmit(oCajaTurnoCajero);

            db.SubmitChanges(); 

        }


        public List<Caja> ListarCaja(string idCaja)
        {
            ModelDataContext db = new ModelDataContext();
            return (from n in db.Caja
                    where n.IdCaja.Equals(idCaja)
                    select n).ToList<Caja>();
        }

        public List<CajaTurnoCajero> ListarCajaP(string idCaja)
        {
            ModelDataContext db = new ModelDataContext();
            return (from n in db.CajaTurnoCajero
                    where n.IdCaja.Equals(idCaja)
                    select n).ToList<CajaTurnoCajero>();
        }

        public List<Cajero> obtenerCajeros()
        {
            ModelDataContext db = new ModelDataContext();
            return (from n in db.Cajero select n).ToList<Cajero>();
        }

        public List<Turno> obtenerTurnos()
        {
            ModelDataContext db = new ModelDataContext();
            return (from n in db.Turno select n).ToList<Turno>();
        }

  
          public string obtenerDesCaja(string idCaja)
          {
              ModelDataContext db = new ModelDataContext();


              var query = from n in db.Caja
                          where n.IdCaja.Equals(idCaja)
                          select n;


              return query.First<Caja>().NombreCaja;
          }


          public string obtenerCajeroTurno(string idCaja)
          {
              ModelDataContext db = new ModelDataContext();


              var query = from n in db.CajaTurnoCajero
                          where n.IdCaja.Equals(idCaja)
                          select n;
              return query.First<CajaTurnoCajero>().IdCajero + "|" + query.First<CajaTurnoCajero>().IdTurno;
          }

    }
}
